package com.abgame.test.javase.tool.zip;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import java.util.zip.Inflater;

public class GZIPUtils {
   /**  
     * 字符串的压缩  
     *   
     * @param str
     *            待压缩的字符串
     * @return    返回压缩后的字符串
     * @throws IOException  
     */  
    public static String compress(String str) throws IOException {
        if (null == str || str.length() <= 0) {  
            return null;
        }  
        // 创建一个新的 byte 数组输出流  
        ByteArrayOutputStream out = new ByteArrayOutputStream();  
        // 使用默认缓冲区大小创建新的输出流  
        GZIPOutputStream gzip = new GZIPOutputStream(out);  
        // 将 b.length 个字节写入此输出流  
        gzip.write(str.getBytes("UTF-8"));
        gzip.close();  
        // 使用指定的 charsetName，通过解码字节将缓冲区内容转换为字符串  
        return out.toString("ISO-8859-1");
    }  

    /**  
     * 字符串的解压  
     *   
     * @param b
     *            对字符串解压  
     * @return    返回解压缩后的字符串  
     * @throws IOException  
     */  
    public static String unCompress(byte[] b) {
       try {
           if (null == b || b.length <= 0) {
               return null;
           }  
           // 创建一个新的 byte 数组输出流  
           ByteArrayOutputStream out = new ByteArrayOutputStream();  
           // 创建一个 ByteArrayInputStream，使用 buf 作为其缓冲区数组  
           ByteArrayInputStream in;
         in = new ByteArrayInputStream(b);
         
           // 使用默认缓冲区大小创建新的输入流  
           GZIPInputStream gzip = new GZIPInputStream(in);  
           byte[] buffer = new byte[256];  
           int n = 0;  
           while ((n = gzip.read(buffer)) >= 0) {// 将未压缩数据读入字节数组  
               // 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此 byte数组输出流  
               out.write(buffer, 0, n);  
           }  
           // 使用指定的 charsetName，通过解码字节将缓冲区内容转换为字符串  
           return out.toString("UTF-8");

       } catch (Exception e) {
         e.printStackTrace();
      }
      return null;  
    }


    /**
     * 解压字符串
     * @param zipStr
     * @return
     */
    public static String unCompress(String zipStr) {
        //将数字字符串 ->  byte[]
        String[] a = zipStr.split(",");
        byte[] data = new byte[a.length];
        int i = 0;
        for (String e : a) {
            data[i] = Integer.valueOf(e).byteValue();

            i++;
        }
        byte[] output = new byte[0];

        Inflater decompresser = new Inflater();
        decompresser.reset();
        decompresser.setInput(data);

        ByteArrayOutputStream o = new ByteArrayOutputStream(data.length);
        try {
            byte[] buf = new byte[1024];
            while (!decompresser.finished()) {
                int j = decompresser.inflate(buf);
                o.write(buf, 0, j);
            }
            output = o.toByteArray();
        } catch (Exception e) {
            output = data;
            e.printStackTrace();
        } finally {
            try {
                o.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        decompresser.end();
        return new String(output) ;
    }

}